package com.zsr.common.utils;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

@Slf4j
@Component
public class CopyListUtils {

    /**
     * 将源对象列表转换为目标类型列表
     *
     * @param sourceObjList 源对象列表
     * @param targetClass   目标类类型（必须有 public 无参构造函数）
     * @param <T>           目标类型
     * @return 转换后的列表，失败时抛异常或跳过（取决于配置）
     */
    public static <T> List<T> convertList(List<?> sourceObjList, Class<T> targetClass) {
        // 参数校验
        if (sourceObjList == null || sourceObjList.isEmpty()) {
            return new ArrayList<>();
        }
        if (targetClass == null) {
            log.warn("目标类为 null，返回空列表");
            return new ArrayList<>();
        }

        try {
            // 使用 Constructor.newInstance() 替代已废弃的方法
            return sourceObjList.stream()
                    .map(sourceObj -> {
                        if (sourceObj == null) {
                            log.warn("源列表中包含 null 元素，跳过");
                            return null;
                        }
                        return JSONObject.parseObject(JSON.toJSONString(sourceObj), targetClass);
                    })
                    .filter(Objects::nonNull) // 过滤掉 null
                    .collect(Collectors.toList());
        } catch (Exception e) {
            log.error("转换列表时发生错误，源列表大小: {}, 目标类: {}",
                    sourceObjList.size(), targetClass.getSimpleName(), e);
            throw e; // 保留原始异常传播
        }
    }
}